from tkinter import *
from tkinter.messagebox import *
import random
import time


def get_verification_code():
    verification_code = ""  # 在之前的案例中我们使用一句话生产验证码 这里改用for循环
    count = 60  # 用来计时
    for i in range(6):
        verification_code += str(random.randint(0, 9))
    show["text"] = verification_code
    show.update()  # 刷新显示

    while count > 1:
        try:
            topic["text"] = "验证码过期还有:" + str(count)
            topic.update()
            time.sleep(1)
            count -= 1
        except:
            break
    else:
        topic['text'] = '验证码失效'
        topic.update()
        showwarning(title="带时间限制的验证码",
                    message='验证码过期，请重新获取！')  # 弹出框
        show['text'] = '验证码失效'
        show.update()


def confirm_code():
    # get()方法获取变量内容
    if not m_str_var.get().strip().isdigit():
        showwarning(title='带时间限制的验证码',
                    message='必须输入为数字，请重新输入！')
    elif len(m_str_var.get().strip()) != 6:
        showwarning(title='带时间限制的验证码',
                    message='输入必须为六位数字，请重新输入!')
    elif str(show['text']).strip() == m_str_var.get().strip():
        showwarning(title='带时间限制的验证码', message='验证码验证正确，将退出！')
        root.destroy()  # 退出窗口
    else:
        showwarning(title='带时间限制的验证码', message='验证码不正确，请重新输入！')


root = Tk()  # 生成root窗口
root.wm_attributes("-topmost", 1)  # 置顶
root.title("带时间限制的验证码")  # 给生成的窗口设置标题名
screenWidth = root.winfo_screenwidth()  # 屏幕宽度
screenHeight = root.winfo_screenheight()  # 屏幕高度
width = 250  # 窗口宽
height = 120  # 窗口高
x = (screenWidth - width) / 2  # 窗口左上角x轴位置
y = (screenHeight - height) / 2  # 窗口左上角y轴位置
# 指定主框体的大小 并且让主框体在屏幕中间显示
root.geometry("%dx%d+%d+%d" % (width, height, x, y))
root.resizable(width=False, height=False)  # 决定框体大小是否能够调整
# 定义完了之后，还不会在窗口中显示，必须加上pack()才行
# 窗口中各个元素的显示顺序是按执行pack()的顺序
topic = Label(root, text="带时间限制的验证码")
topic.pack()
show = Label(root, text=0)  # 这个Label等会用来显示验证码
show.pack()
m_str_var = StringVar()  # 字符串变量 默认是""
instr = Entry(root, textvariable=m_str_var)
instr.pack()
# 按钮 Button第一个参数:父对象 text: 功能按钮名称 width=宽(字符宽) height=高(字符高)
# # command:单价功能按钮时，执行此函数或者是方法
get_code = Button(root, text="获取验证码", command=get_verification_code,                   width=15, height=1)
get_code.pack(side="left")
confirm = Button(root, text="确认", command=confirm_code, width=15, height=1)
confirm.pack(side="right")
root.mainloop()  # 进入消息循环(必需组件)


